💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    01 설정과 모델 구성 | ✅ 편저: 코담 운영자

    01-Django REST Framework(DRF) - 설정과 모델 구성

    - 설정과 모델 구성


    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series

    ✅1) 프로젝트 실행 방법 :

    Starter Code 디렉토리 복사 후 실행
    

    1. 개요

    이번 시리즈에서는 Django에서 가장 인기 있는 API 구축 도구인 Django REST Framework(DRF) 를 처음부터 끝까지 단계별로 다루게 됩니다. 이 영상에서는 DRF의 전반적인 개요와 함께, API에 필요한 기본 모델(Product, Order, OrderItem, User)을 정의합니다.


    2. REST API 구성 계획

    이번 시리즈에서 만들 API는 다음 기능들을 포함합니다:

    • 상품 조회 및 상세 보기
    • 상품 생성, 수정, 삭제
    • 주문 생성 및 조회
    • 사용자 인증 및 권한 설정

    강의 전반에서는 다음과 같은 DRF의 핵심 개념들을 다룰 예정입니다:

    • Request, Response 객체
    • 함수형/제너릭/클래스 기반 뷰
    • ViewSet
    • Serializer
    • 인증(Authentication), 권한(Permission)
    • 캐싱, 페이징, 필터링
    • 테스트 코드 작성 등

    3. 모델 구성 개요

    이 API는 총 4개의 주요 모델을 기반으로 구성됩니다:

    • Product: 상품
    • Order: 주문
    • OrderItem: 상품과 주문 사이의 연결 테이블
    • User: 사용자 모델(커스텀 User 모델 사용)

    아래는 django-extensionsgraph_models 명령어로 생성한 ERD(Entity Relationship Diagram)입니다. 이 구조를 바탕으로 모델을 생성합니다.

    모델 구조

    🔶 1. User 모델 (api_models_User)
    • AbstractUser를 상속하여 확장된 사용자 모델입니다.

    • 기본적으로 Django에서 제공하는 인증 필드를 포함합니다.

    🔸 주요 필드

    필드명 필드 타입 설명
    id BigAutoField 기본 키 (자동 생성)
    username CharField 사용자명
    email EmailField 이메일 주소
    password CharField 비밀번호 (해시 처리됨)
    first_name / last_name CharField 이름 / 성
    is_active, is_staff, is_superuser BooleanField 활성화 여부, 직원 여부, 슈퍼유저 여부
    last_login DateTimeField 마지막 로그인 시간
    date_joined DateTimeField 가입일자
    🔶 2. Product 모델 (api_models_Product)
    • 판매되는 상품 정보를 담고 있는 모델입니다.
    🔸 주요 필드
    필드명 필드 타입 설명
    id BigAutoField 기본 키
    name CharField 상품명
    description TextField 상품 설명
    image ImageField 상품 이미지
    price DecimalField 상품 가격
    stock PositiveIntegerField 재고 수량
    🔶 3. Order 모델 (api_models_Order)
    • 사용자의 주문 정보를 저장합니다.
    🔸 주요 필드
    필드명 필드 타입 설명
    order_id UUIDField 주문 식별자 (고유 UUID)
    user ForeignKey → User 주문자
    created_at DateTimeField 주문 생성 시간
    status CharField 주문 상태 (예: 결제완료, 배송중 등)
    🔶 4. OrderItem 모델 (api_models_OrderItem)
    • 주문에 포함된 상품 항목들입니다.

    🔸 주요 필드

    필드명 필드 타입 설명
    id BigAutoField 기본 키
    order ForeignKey → Order 어떤 주문에 속한 항목인지
    product ForeignKey → Product 어떤 상품인지
    quantity PositiveIntegerField 수량

    🔁 관계 요약

    • UserOrder: 1:N 관계 (사용자는 여러 주문 가능)

    • OrderOrderItem: 1:N 관계 (주문에는 여러 상품 항목이 있음)

    • OrderItemProduct: N:1 관계 (여러 주문 항목이 하나의 상품 참조)


    4. 모델 생성 과정

    1) User 모델

    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        pass
    

    기본 AbstractUser를 상속받아 향후 확장을 고려한 사용자 모델을 정의합니다.

    settings.py에 다음을 추가해야 합니다:

    AUTH_USER_MODEL = 'api.User'
    

    2) Product 모델

    class Product(models.Model):
        name = models.CharField(max_length=200)
        description = models.TextField()
        price = models.DecimalField(max_digits=10, decimal_places=2)
        stock = models.PositiveIntegerField()
        image = models.ImageField(upload_to='products/', blank=True, null=True)
    
        @property
        def in_stock(self):
            return self.stock > 0
    
        def __str__(self):
            return self.name
    

    🛍️ Product 모델은 상품 정보를 저장하는 클래스입니다.

    주요 항목:
    • name: 상품 이름 (문자열, 200자까지)

    • description: 상품 설명 (긴 글 가능)

    • price: 상품 가격 (소수점 포함 금액)

    • stock: 재고 수량 (0 이상 정수)

    • image: 상품 이미지 (선택사항)

    추가 기능:
    • in_stock: 재고가 있으면 True, 없으면 False
      👉 product.in_stock 이렇게 사용

    • __str__: 객체를 문자열로 출력할 때 상품 이름이 보이게 함
      👉 예: print(product) 하면 상품명 출력

    3) Order 모델

    import uuid
    
    class Order(models.Model):
        class StatusChoices(models.TextChoices):
            PENDING = 'Pending'
            CONFIRMED = 'Confirmed'
            CANCELLED = 'Cancelled'
    
        order_id = models.UUIDField(primary_key=True, default=uuid.uuid4)
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now_add=True)
        status = models.CharField(max_length=10, choices=StatusChoices.choices, default=StatusChoices.PENDING)
        
        products = models.ManyToManyField(Product, through='OrderItem', related_name='orders')
    
        def __str__(self):
            return f"Order {self.order_id} by {self.user.username}"
    
    🧾 Order 모델은 주문 정보를 저장하는 클래스입니다.

    주요 항목:

    • order_id: 주문 번호 (UUID 형식, 자동 생성됨)

    • user: 주문한 사용자 (User 모델과 연결됨)

    • created_at: 주문 생성 시간 (자동 저장)

    • status: 주문 상태 (Pending, Confirmed, Cancelled 중 하나)

    🔗 상품 연결
    • products: 주문한 상품들
      OrderItem이라는 중간 테이블을 통해 연결 (수량 등 추가 정보 가능)

    📌 추가 기능
    • __str__: 문자열로 출력할 때
      👉 예: Order 7c12... by junho

    4) OrderItem 모델

    class OrderItem(models.Model):
        order = models.ForeignKey(Order, on_delete=models.CASCADE,related_name='items')
        product = models.ForeignKey(Product, on_delete=models.CASCADE)
        quantity = models.PositiveIntegerField()
    
        @property
        def item_subtotal(self):
            return self.product.price * self.quantity
    
        def __str__(self):
            return f"{self.quantity} x {self.product.name} in Order {self.order.order_id}"
    
    🧾 OrderItem 모델: 주문 안의 개별 상품 정보

    🔹 필드 설명

    • order: 어떤 주문인지 (→ Order 모델과 연결)

    • product: 어떤 상품인지 (→ Product 모델과 연결)

    • quantity: 주문 수량 (양의 정수)

    💰 item_subtotal 속성

    Python의 @property메서드를 속성처럼 사용할 수 있게 해주는 기능입니다. 즉, 괄호 없이 함수처럼 보이지 않고 변수처럼 접근할 수 있게 해줍니다.

    • 이 상품의 소계 금액 계산

    • 가격 × 수량 계산해서 반환
      예: 티셔츠(₩10,000) 2개 → 20,000원

    🖨️ __str__ 설명
    • 출력 예시: "2 x 티셔츠 in Order a1b2..."
      → 몇 개의 어떤 상품이 어떤 주문에 포함됐는지 보여줌

    📌 요약

    이 모델은 "주문 안에 있는 각 상품" + 수량 + 금액 계산을 담당합니다


    5. 마이그레이션 적용 및 DB 생성

    python manage.py makemigrations
    python manage.py migrate
    

    SQLite 데이터베이스에 테이블이 생성되며, Django SQLite Explorer로 확인 가능합니다.


    6. 더미 데이터 삽입 (populate_database 커맨드)

    manage.py에 있는 커스텀 커맨드인 populate_database를 실행하면 다음과 같은 데이터가 자동 삽입됩니다:

    • 테스트 사용자 1명
    • 무작위 상품 여러 개
    • 무작위 주문 3개
    • 각 주문마다 2개의 상품을 포함한 OrderItem
    python manage.py populate_db
    

    데이터베이스를 확인하면 각 테이블이 잘 채워져 있고, 상품-주문 간 다대다 관계도 연결되어 있음을 확인할 수 있습니다.


    7. ERD 시각화 도구

    django-extensionsgraph_models 명령어를 이용해 ERD를 생성할 수 있습니다:

    python manage.py graph_models api > models.dot
    

    생성된 .dot 파일을 Graphviz Online 등에 붙여넣으면 ER 다이어그램을 시각화할 수 있습니다.


    8. 마무리 및 다음 강의 예고

    이제 모델 구성이 완료되었으며, 다음 영상에서는 DRF의 핵심 기능인 Serializer를 학습합니다. Serializer는 Django 모델/쿼리셋을 JSON으로 직렬화하거나, JSON 데이터를 유효성 검사 후 모델 인스턴스로 변환하는 데 사용됩니다.


    다음 학습: DRF에서 Serializer의 개념과 역할 알아보기

    TOP
    preload preload